package br.ucb.service;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.text.SimpleDateFormat;




import javax.servlet.http.HttpServletRequest;

import br.ucb.enumeradores.Sexo;
import br.ucb.enumeradores.TempoUso;
import br.ucb.exceptions.PersistenceException;
import br.ucb.modelo.negocio.Bazar;
import br.ucb.modelo.negocio.Compra;
import br.ucb.modelo.negocio.ItemEstoque;
import br.ucb.modelo.negocio.Produto;
import br.ucb.modelo.negocio.User;
import br.ucb.modelo.dao.BazarDAO;
import br.ucb.modelo.dao.CompraDAO;
import br.ucb.modelo.dao.DAO;
import br.ucb.modelo.dao.ProdutoDAO;
import br.ucb.modelo.dao.UserDAO;

public class Servicos {
   public static String [] obtemEstados() {
	   String [] estados = {"AC", "AL", "AM", "AP",  "BA", "CE", "DF", "ES", "GO", "MA", "MG", "MS", "MT", "PA", "PB", "PE", "PI", "PR", "RJ", "RN", "RO", "RR", "RS", "SC", "SE", "SP", "TO"};
	   return estados;
   }
   
   public static User putUser(ResultSet rs) throws PersistenceException {
	 User user = null;
	 Sexo sexo;
	 try {  
	   if(rs.getString("sexo").equals(Sexo.MASCULINO.toString()))
		   sexo = Sexo.MASCULINO;
	   else
		   sexo = Sexo.FEMININO;
	 
		user = new User(rs.getString("nome"),
				   rs.getString("cpf"),
				   sexo, 
				   rs.getString("email"),
				   rs.getDate("dataNascimento"),
				   rs.getString("estado"),
				   rs.getString("cidade"),
				   rs.getString("complemento"),
				   rs.getInt("ddd"),
				   rs.getString("numero"),
				   rs.getString("login"),
				   rs.getString("senha"));
		user.setId(rs.getLong("id"));
	 } catch (SQLException e) {
		e.printStackTrace();
		throw new PersistenceException();
	 }
	 return user;
   }
   
   public static Produto putProduto(ResultSet rs) throws SQLException {
		 Produto produto = null;
		 TempoUso tempo;
		 
		 tempo = selecionaTempoUso(rs.getString("tempoUso"));
		 produto = new Produto(
					rs.getString("nome"),
					rs.getString("descricao"),
					rs.getFloat("preco"),
					tempo,
					rs.getLong("idBazar"),
					rs.getString("status"),
					rs.getInt("quantidadeEstoque"));
		            
		 
		 produto.setId(rs.getLong("id"));
		 produto.setImagem(rs.getBytes("imagem"));
		 return produto;
	   }
   
   public static boolean cadastraUser(User user, DAO <User> dao) {
	   if(user == null)
		   return false;
	   try { 
		  if(dao.insert(user) == 0)
			  return false;
	   } catch (PersistenceException e) {
		  e.printStackTrace();
		  return false;
	   }
	   return true;
    }
   
   public static User recuperaUserDaoLogin(String login, UserDAO dao) {
	   try {
		   return dao.findByLogin(login);
	   } catch(PersistenceException e) {
		   return null;
	   }
	   
   }

    public static User montaUserRequest(HttpServletRequest request) {
	    String id = request.getParameter("id"); 
    	String nome = request.getParameter("nome");
	     String cpf = request.getParameter("cpf");
	     Sexo sexo;
	     if(request.getParameter("sexo").equals(Sexo.MASCULINO.toString()))
            sexo = Sexo.MASCULINO;
	     else
	    	sexo = Sexo.FEMININO;
	     String email = request.getParameter("email");
	     String dataString = request.getParameter("dataNascimento");
	     DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");   
	     Date dataNascimento = null;
		try {
			dataNascimento = new Date(fmt.parse(dataString).getTime());
		} catch (ParseException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
			return null;
		}
	     String estado = request.getParameter("estado");
	     String cidade = request.getParameter("cidade");
	     String complemento = request.getParameter("complemento");
	     Integer ddd = Integer.parseInt(request.getParameter("ddd"));
	     String numero = request.getParameter("numero");
	     String login = request.getParameter("login");
	     String senha = request.getParameter("senha");
	     User user = new User(nome, cpf, sexo, email, dataNascimento, estado, cidade, complemento, ddd, numero, login, senha);
	     if(id != null) {
	    	 user.setId(Long.parseLong(id));
	     }
	     return user;
    }
    
    public static boolean excluiUser(HttpServletRequest request, User user, UserDAO userDAO, BazarDAO bazarDAO, ProdutoDAO produtoDAO) {
		 try {
			Bazar bazar = bazarDAO.findById(user.getId());
			List <Compra> compras = new CompraDAO().findAllbyComprador(user.getId());
			List <Compra> vendas = new CompraDAO().findAllbyVendedor(user.getId());
			compras.addAll(vendas);
			for(Compra compra : compras) {
				Servicos.excluiVenda(request, compra);
			}
			if(bazar != null) {
			   List <Produto> produtos = produtoDAO.findByIdBazar(bazar.getId());
			   if(!produtos.isEmpty()) { 
				   if(produtoDAO.deleteByIdBazar(bazar.getId()) > 0) {
					   if(bazarDAO.delete(user.getId()) > 0) {
						   if(userDAO.delete(user.getId()) > 0) {
							   return true;
						   }
					   }
				   } else {
					   bazarDAO.insert(user.getId());
					   bazar = bazarDAO.findById(user.getId());
					   for(Produto produto: produtos)
						   produtoDAO.insert(produto);
					   return false;
				   }
			   }
			   if(bazarDAO.delete(user.getId()) >0) {
				   if(userDAO.delete(user.getId()) > 0) {
					   return true;
				   } else {
					   bazarDAO.insert(user.getId());
				   }
			   }
			} else {
			  if(userDAO.delete(user.getId()) == 0)
			    return false;
			  else 
				  return true;
			}
		} catch (PersistenceException e) {
			e.printStackTrace();
			return false;
		}
		 return true;
	}

	public static boolean alterarUser(User user, UserDAO dao) {
		  if(user == null)
			   return false;
		   try { 
			  if(dao.update(user) == 0)
				  return false;
		   } catch (PersistenceException e) {
			  e.printStackTrace();
			  return false;
		   }
		   return true;
		
	}

	public static Bazar putBazar(ResultSet rs) throws SQLException {
		Bazar bazar = new Bazar(rs.getLong("idUser"));
		bazar.setId(rs.getLong("id"));
		return bazar;
	}

	public static Produto montaProdutoRequest(HttpServletRequest request) {
		Long id = null;
	    Bazar bazar = (Bazar) request.getSession().getAttribute("bazar");
		Long idBazar = bazar.getId();
		String nome = request.getParameter("nome");
		String descricao = request.getParameter("descricao");
		Float preco = Float.parseFloat(request.getParameter("preco"));
		TempoUso tempoUso = selecionaTempoUso(request.getParameter("tempoUso"));
		Integer quantidadeEstoque = Integer.parseInt(request.getParameter("quantidadeEstoque"));
		String status = "Disponivel";
		
		if(request.getParameter("id") != null)
			id = Long.parseLong(request.getParameter("id"));
		Produto produto = new Produto(nome, descricao, preco, tempoUso, idBazar, status, quantidadeEstoque);
		produto.setId(id);
		return produto;
	}

	public static TempoUso selecionaTempoUso(String tempoUso) {
		if(tempoUso.toString().equalsIgnoreCase("NOVO"))
			return TempoUso.NOVO;
		else if(tempoUso.toString().equalsIgnoreCase("USADO"))
			return TempoUso.USADO;
		else
		   return TempoUso.SEMINOVO;
	}

	public static boolean cadastraProduto(Produto produto, ProdutoDAO dao) {
		if(produto == null)
			   return false;
		   try { 
			  if(dao.insert(produto) == 0)
				  return false;
		   } catch (PersistenceException e) {
			  e.printStackTrace();
			  return false;
		   }
		   return true;
	}
	
	public static boolean alteraProduto(Produto produto, ProdutoDAO dao) {
		if(produto == null)
			   return false;
		   try { 
			  if(dao.update(produto) == 0)
				  return false;
		   } catch (PersistenceException e) {
			  e.printStackTrace();
			  return false;
		   }
		   return true;
	}
	
	public static boolean deletaProduto(Long idProduto, ProdutoDAO dao) {
		if(idProduto == null)   
			return false;
		try { 
		  if(new CompraDAO().findByIdProduto(idProduto)) { 
		      if(new CompraDAO().deleteCompra(idProduto) == 0)
		    	  return false;
		  }
		  if(dao.delete(idProduto) > 0)
		      return true;
		} catch (PersistenceException e) {
		   e.printStackTrace();
		}
		   
		   return false;
	}
	
	public static boolean cadastraBazar(Long idUser, BazarDAO dao) {
		if(idUser == null)
			   return false;
		   try { 
			  if(dao.insert(idUser) == 0)
				  return false;
		   } catch (PersistenceException e) {
			  e.printStackTrace();
			  return false;
		   }
		   return true;
	}

	public static List<Produto> obtemProdutosBazar(Long idBazar, ProdutoDAO dao) {
		List <Produto> produtos = ListFactory.getDefaultListProduto();
		try {
			produtos = dao.findByIdBazar(idBazar);
		} catch (PersistenceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		return produtos;
	}
	
	public static Produto obtemProdutoPorId(Long id) {
		Produto produto = null;
		try {
			produto = new ProdutoDAO().findByID(id);
		} catch (PersistenceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return produto;
	}
	
	public static List <ItemEstoque> obtemProdutosVenda(HttpServletRequest request, ProdutoDAO dao) {
		List<ItemEstoque> itens = ListFactory.getDefaultListItems();
		try {
			itens = dao.findAllProdutosVenda();
			if(itens.isEmpty())
				request.setAttribute("nenhumProduto", "");
		} catch (PersistenceException e) {
			e.printStackTrace();
			request.setAttribute("erroBanco", "");
		}
		return itens;
	}

	public static ItemEstoque putItem(ResultSet rs) throws SQLException {
        TempoUso tempoUso = selecionaTempoUso(rs.getString("produto.tempoUso"));
		ItemEstoque item = new ItemEstoque(rs.getString("produto.nome"), rs.getString("produto.descricao") , rs.getFloat("produto.preco"), rs.getString("usuario.nome"), rs.getLong("produto.id"), rs.getLong("usuario.id"), tempoUso, rs.getInt("produto.quantidadeEstoque"));
	    item.setImagem(rs.getBytes("produto.imagem"));
	    return item;
	}

	public static ItemEstoque findProdutoVisualizar(List<ItemEstoque> itens,
			HttpServletRequest request) {
		Long idProduto = Long.parseLong(request.getParameter("idP"));
		Long idVendedor = Long.parseLong(request.getParameter("idV"));
		for(ItemEstoque item : itens)
			if(item.getIdProduto() == idProduto && item.getIdVendedor() == idVendedor)
				return item;
		return null;
	}

	public static List <ItemEstoque> obtemProdutosVendaLogin(HttpServletRequest request, Long id, ProdutoDAO dao) {
		List<ItemEstoque> itens = ListFactory.getDefaultListItems();
 	    try {
		  itens = dao.findProdutosOutros(id);
		  if(itens.isEmpty())
			request.setAttribute("nenhumProduto", "");
	    } catch (PersistenceException e) {
	  	  e.printStackTrace();
		  request.setAttribute("erroBanco", "");
	    }
	    return itens;
	}

	public static void realizaCompra(HttpServletRequest request,
			CompraDAO compraDAO, ProdutoDAO produtoDAO,  User usuario) {
		   Long idProduto = Long.parseLong(request.getParameter("idP"));
		   Compra compra = new Compra(idProduto, usuario.getId(), Float.parseFloat(request.getParameter("preco")));
		   try {
			   if(compraDAO.insert(compra) > 0) {
				   if(produtoDAO.updateStatusCompra(compra.getIdProduto(), "Vendido") > 0) {
					    request.setAttribute("sucessoCadastroCompra", "");
				   } else {
					   compraDAO.deleteCompra(compra.getIdProduto());
					   request.setAttribute("erroCadastroCompra", "");
				   }
			   } else {
				   request.setAttribute("erroCadastroCompra", "");
			   }
		   } catch (PersistenceException e) {
			   e.printStackTrace();
			   request.setAttribute("erroCadastroCompra", "");
		}
		
	}

	public static Compra putCompra(ResultSet rs) throws SQLException{
		Compra compra = new Compra(rs.getLong("idProduto"), rs.getLong("idComprador"), rs.getFloat("preco"));
		compra.setDataCompra(rs.getTimestamp("compra.dataCompra"));
		compra.setId(rs.getLong("compra.id"));
		compra.setNomeProduto(rs.getString("produto.nome"));
		compra.setPreco(rs.getFloat("compra.preco"));
		compra.setDescricaoProduto(rs.getString("produto.descricao"));
		compra.setTempoUso(selecionaTempoUso(rs.getString("produto.tempoUso")));
		compra.setImagem(rs.getBytes("produto.imagem"));
		return compra;
	}
	
	public static List <Compra> obtemHistoricoCompra(HttpServletRequest request, Long id) {
		List <Compra> compras = ListFactory.getDefaultListCompras();	
		try {
			compras = new CompraDAO().findAllbyComprador(id);
			if(compras.isEmpty())
				request.setAttribute("nenhumaCompra", "");
		} catch (PersistenceException e) {
			e.printStackTrace();
			request.setAttribute("erroBanco", "");
		}
		return compras;
	}
	
	public static List <Compra> obtemHistoricoVenda(HttpServletRequest request, Long id) {
		List <Compra> compras = ListFactory.getDefaultListCompras();	
		try {
			compras = new CompraDAO().findAllbyVendedor(id);
			if(compras.isEmpty())
				request.setAttribute("nenhumaVenda", "");
		} catch (PersistenceException e) {
			e.printStackTrace();
			request.setAttribute("erroBanco", "");
		}
		return compras;
	}

	public static Compra findProduto(List<Compra> compras,
			HttpServletRequest request) {
		    
		    Long idVenda = Long.parseLong(request.getParameter("idV"));
		    for(Compra compra: compras) {
			   if(compra.getId() == idVenda)
				   return compra;
		    }
		return null;
	}

	public static void excluiVenda(HttpServletRequest request, Compra compra) {
		try {
			if(new CompraDAO().delete(compra.getId()) > 0)
				if(new ProdutoDAO().updateStatus(compra.getIdProduto(), "Disponivel") > 0) 
				   request.setAttribute("sucessoDeletar", "");
				else
					request.setAttribute("falhaAtualizarStatus", "");
			else
				request.setAttribute("erroDeletar", "");
		} catch (PersistenceException e) {
			e.printStackTrace();
			request.setAttribute("erroBanco", "");
		}
	}
}
